package 动态代理;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 类的作用:
 * @author创建一个代理
 */
public class ProxyUtil{
    /**
     * 方法的作用
     * @author 给明星对象创建一个代理
     *形参:
     * @author 被代理的明星对象
     * 返回值:
     * @author 给明星创建的代理
     *
     * java.lang.reflect.Proxy类:提供了为对象产生代理对象的方法:
     * public static Obiect newProxyInstance(Classloader loader, Class<?>[] interfaces, InvocationHandler h)
     * 参数一:用于指定用哪个类加载器，去加载生成的代理类
     * 参数二:指定接口，这些接口用于指定生成的代理长什么，也就是有哪些方法
     * 参数三:用来指定生成的代理对象要千什么事情
     */
    public static Star createProxy(BigStar bigStar) {
       Star star= (Star) Proxy.newProxyInstance(
               ProxyUtil.class.getClassLoader(),
               new Class[]{Star.class},
               new InvocationHandler() {
                   @Override
                   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                       /**
                        * 参数一:代理的对象
                        * 参数二:要运行的方法
                        * 参数三:代用时传递的实参(如sing方法的歌曲的名字)
                        */
                       if ("sing".equals(method.getName())) {
                           System.out.println("准备话筒");
                       }else if ("jump".equals(method.getName())) {
                           System.out.println("找出场地,收钱");
                       }
                       //利用反射去找出明星唱歌或跳舞
                       //直接调用唱歌或者跳舞的方法
                       Object invoke = method.invoke(bigStar, args);
                       return invoke;
                   }
               }
       );
       return star;
    }
}
